perm filename SUMNER.MF[MF,DEK] blob
sn#750640 filedate 1984-04-13 generic text, type C, neo UTF8
COMMENT ā VALID 00006 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 % macros that may go into PLAIN.MF some day
C00006 00003 % setting up the font parameters
C00008 00004 % font initialization
C00010 00005 "The letter A"
C00011 00006 end
C00012 ENDMK
Cā;
% macros that may go into PLAIN.MF some day
delimiters ();
epsilon=.00001; % METAFONT's smallest positive number
vardef round primary x = trunc(x+.5) enddef;
numeric displaying; % if > 0, displays after each character;
% if > 1, displays after each fil, etc.
boolean makingfont; % true if outputting to GF file.
def beginchar (expr code, units, point_height, point_depth) =
begincharacter
charcode=code;
charht=point_height;
chardp=point_depth;
numeric u,r;
r=round(units*pu*ppp-1)=units*u;
charwd=units*pu; chardw=r+1;
edges ee;
numeric labelchar; labelchar=ord"a"-1;
if displaying>0:
openwindow cur_window from NWcorner to SEcorner at topleftpoint; fi
enddef;
def endchar =
if displaying>0: display_ee; fi
if makingfont: shipout ee; fi
endcharacter
enddef;
def quit= enddef; % type "quit" when MF keeps asking for more input
outer beginchar, endchar, quit;
def fil expr x =
addto ee weighted 1 contour x;
everydraw;
enddef;
def plain_everydraw =
if displaying>1: display_ee; fi
enddef;
let everydraw=plain_everydraw;
def display_ee =
display ee onwindow cur_window
enddef;
numeric cur_window, window_counter;
window_counter=16;
vardef newwindow =
begingroup
if window_counter>0: window_counter:=window_counter-1;
else: errmessage("All windows are already taken"); fi
window_counter endgroup
enddef;
cur_window:=newwindow;
vardef z@# = (x@#,y@#) enddef;
vardef zz@# = (xx@#,yy@#) enddef;
def penpos(suffix i)(expr length,theta)=
z.i.r-z.i.l = (length,0) rotated theta;
z.i = .5[z.i.l, z.i.r] enddef;
def penstroke(suffix i,j)(expr lambda,rho,alpha)=
begingroup save xx,yy;
zz.mid=alpha[z.i,z.j];
zz.l=alpha[z.i.l,z.j.l]; zz.r=alpha[z.i.r,z.j.r];
zz.mid.l=lambda[zz.l,zz]; zz.mid.r=rho[zz.r,zz];
fil z.i.l .. z.i.r
& z.i.r{zz.mid-z.i.r} .. z.mid.r{z.j.r-z.i.r} .. z.j.r{z.j.r-zz.mid}
& z.j.r .. z.j.l
& z.j.l{zz.mid-z.j.l} .. z.mid.l{z.i.l-z.j.l} .. z.i.l{z.i.l-zz.mid}
& cycle;
labelchar:=labelchar+1; threelabels (char labelchar, zz.mid);
endgroup enddef;
def threelabels(expr s)(text z)=
autolabel z as s; autolabel z.l as s&"L"; autolabel z.r as s&"R"
enddef;
def penlabels(text suffixes)=
forsuffixes $=suffixes: threelabels(string$,z$) endfor enddef;
def isbetween(expr u,v)=
collinearop u=alpha*(v-u); endgroup enddef;
primarydef z collinearop u =
begingroup save alpha; z-u enddef; % watch out, that was tricky
% setting up the font parameters
def atypi_parameters=
size=10; % design size, in points
u.pts=26/36; % unit width, in points
H.pts=250/36; % cap height, in points
thin.pts=22/36; % narrow pen width, in points
thick.pts=44/36; % wide pen width, in points
aspect=.85; % aspect ratio, in points
cut=15; % cut angle at baseline, in degrees
gap=1; % gap amount, in relative units
tau=0.4; % taper parameter
enddef
def atypi_setup=
numeric tau[]; tau.low=tau*tau; tau.high=sqrt tau; tau.med.low=tau*tau2;
numeric thin, thick, H;
pair topleftpoint;
thin=round(ppp*thin.pts+blacker);
thick=round(ppp*thick.pts+blacker);
H=round(ppp*H.pts);
topleftpoint=(-2u,1.3H);
enddef
message "Please type a mode, followed by options like magnification, etc.";
message "mode="; readterminal getoptions;
mode=getoptions;
% font initialization
proof=0; lowres=1; dover=2; canon=3; smoke=4; % symbolic names of modes
step0.5=sqrt 1.2; step1=1.2; step2=1.44; step3=1.728; step4=2.0736; step5=2.48832;
if unknown mag: mag:=1; fi
if mode=proof: proofmode:=1; displaying:=2; tracingtitles:=1; labelling:=1;
makingfont:=false;
ppp=36*mag; blacker=0; overcorr=1; % for initial design of characters
elseif mode=lowres: makingfont:=true;
ppp=(200/72.27)*mag; blacker=.65; overcorr=.4; % XGP, etc.
elseif mode=dover: makingfont:=true;
ppp=(384/72.27)*mag; blacker=1.2; overcorr=.6; % Xerox Dover
elseif mode=canon: makingfont:=true;
ppp=(240/72.27)*mag; blacker=.65; overcorr=.4; % XGP, etc.
elseif mode=smoke: proofmode:=1; tracingtitles:=1; displaying:=1;
makingfont:=false;
ppp=72; blacker=0; overcorr=1; % "smoke proofs"
else: input mode;
fi;
pair NWcorner,SEcorner;
atypi_parameters;
atypi_setup;
designsize:=size;
NWcorner=(0,0); SEcorner=(10000,10000);
"The letter A";
beginchar(ord"A", 13, 1.1H.pts, 0);
y1=0; x1l=.5u; penpos(1,-cut-45,thin);
y4=0; x4r=r-.5u; penpos(4,cut+15,thick);
z2=(.5r,1.1H); penpos(2,cut+25,thick);
y3=H; z3 isbetween (z2,z4); penpos(3,cut+15,2/3[thin,thick]);
y5r=y6r=3/7H; penpos(5,45,aspect*thin);
penpos(6,135,aspect*thin);
z5+(gap*u+.5thin,0) isbetween (z1,z3);
z6+(gap*u+.5thick,0) isbetween (z2,z4);
penstroke(2,4,tau.low,tau,.45); % right diagonal
penstroke(3,1,tau.high,tau.med.low,.6); % left diagonal
penstroke(5,6,0,0,.5); % bar line
penlabels 1,2,3,4,5,6;
endchar;
end
% Note, a devious thing to try:
let begin_char=beginchar;
let end_char=endchar;
let semicolon=;;
def beginchar=
let endchar=quote enddef;
let ;=finishup semicolon
def chartext = beginchar enddef;
def finishup=
let ;=semicolon;
let endchar=end_char;
let beginchar=begin_char enddef;